//package com.aabbc.aaaaa.utils;
//
//
//import org.apache.commons.logging.Log;
//import org.apache.commons.logging.LogFactory;
//import org.springframework.util.Assert;
//import org.springframework.util.StringUtils;
//
//import java.beans.BeanInfo;
//import java.beans.Introspector;
//import java.beans.PropertyDescriptor;
//import java.lang.reflect.Field;
//import java.lang.reflect.InvocationTargetException;
//import java.lang.reflect.Method;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.regex.Pattern;
//
//
///**
// * 逻辑、功能相关描述:复制VO中的属性，打印VO中的属性
// *
// * @author  luojunlin & Tyler Chen 编写日期：2008-1-23
// */
//public final class BeanUtils extends org.apache.commons.beanutils.BeanUtils {
//
//    protected static final Log logger = LogFactory.getLog(BeanUtils.class);
//
//    /**
//     * Function: vo与do的互相转换
//     * 1、可以对子Do进行转换,但有规则限制：1)Vo(Do)对像包括的为vo(Do)对象
//     * 1、如果原对象属性的值为空或是集合框架(Set、List、Map),则不进行转换;
//     * 2、如果原对像有某属性，目标对象无该属性方法，则急略此值
//     * 3、如果转换出错，将打印异常，但不抛出
//     * @param sourceOBJ
//     * @param targetOBJ
//     * Create author:luojunlin
//     * Create on:${date}
//     * Edit author:
//     * Edit on:
//     * Why:
//     */
//    public static void convertVoAsDo(Object sourceOBJ, Object targetOBJ){
//        try{
//            //取得原对象和目标对象的列表
//            BeanInfo sourceBi=Introspector.getBeanInfo(sourceOBJ.getClass());
//            BeanInfo targetBi=Introspector.getBeanInfo(targetOBJ.getClass());
//            PropertyDescriptor sourcePops[]=sourceBi.getPropertyDescriptors();
//            PropertyDescriptor targetPops[]=targetBi.getPropertyDescriptors();
//            Map<String, Object> sourceMap=new HashMap<String, Object>();
//
//            //遍例原对像所有属性,并将值放入sourceMap,key为属性名
//            for (PropertyDescriptor p : sourcePops){
//                if (!"class".equals(p.getName())) {
//                    Object result=p.getReadMethod().invoke(sourceOBJ, new Object[]{});
//                    sourceMap.put(p.getName(), result);
//                }
//            }
//
//            //遍例目标对像所有属性,根据属性名调用set方法,结果从map中取,如果为null不进行操作
//            for (PropertyDescriptor p : targetPops) {
//                //目标对象的属性名
//                String propertyName=p.getName();
//                //vo转do,do转vo
//                if (Pattern.matches("\\w*(V(O))", p.getName().toUpperCase())) {
//                    propertyName=propertyName.replaceAll("(\\w*)(V)(O|o)", "$1D$3");
//                } else if (Pattern.matches("\\w*(D(O))", p.getName().toUpperCase())) {
//                    propertyName= propertyName.replaceAll("(\\w*)(D)(O|o)", "$1V$3");
//                }
//                //根据属性取原对像的值
//                Object result=sourceMap.get(propertyName);
//                //开始转换
//                if (!p.getName().equals("class") && result != null) {
//                    //如果目标对像是一个vo或do 时，则对该子对象进行转换（递归调用）
//                    if (Pattern.matches("\\w*(VO|DO)", propertyName.toUpperCase())) {
//                        //构建属性对象
//                        Class<?> cls=Class.forName(p.getPropertyType().getName());
//                        Object tempOBJ=cls.newInstance();
//                        //递归调用,以转换子对象
//                        convertVoAsDo(result, tempOBJ);
//                        p.getWriteMethod().invoke(targetOBJ,tempOBJ);
//                    } else {
//                        //若不是子对像，则直接转换
//                        p.getWriteMethod().invoke(targetOBJ,result);
//                    }
//                }
//            }
//        }catch(Exception e){
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * Function: 打印targetObj所有属性值
//     * 注：本方法仅打印有公有的get方法的成员属性
//     * @param targetObj
//     * @param isCol 是否列向显示
//     * Create author:luojunlin
//     * Create on:${date}
//     * Edit author:
//     * Edit on:
//     * Why:
//     */
//    public static void printfInfo(Object targetObj,boolean isCol){
//        try {
//            Class<?> targetClass=targetObj.getClass();
//            BeanInfo bi=Introspector.getBeanInfo(targetClass);
//            PropertyDescriptor pops[]= bi.getPropertyDescriptors();
//            int count=0;//打印的字段计数器
//            System.out.println("-------------"+targetClass.getName()+"-----------------");
//            if (isCol) {//横向显示
//                for (PropertyDescriptor item : pops) {
//                    if (!item.getName().equals("class")) {
//                        Object result=item.getReadMethod().invoke(targetObj, new Object[]{});
//                        System.out.println(item.getName()+"：\t"+result+"");
//                        count++;
//                    }
//                }
//            } else {//列向显示
//                StringBuilder fieldName=new StringBuilder();
//                StringBuilder fieldValue=new StringBuilder();
//                for (PropertyDescriptor item : pops) {
//                    if (!item.getName().equals("class")) {
//                        Object result=item.getReadMethod().invoke(targetObj, new Object[]{});
//                        String tempName=formatString(item.getName(),20);
//                        fieldName.append(tempName+"\t");
//                        String tempValue=formatString("\t"+result+"\t",20);
//                        fieldValue.append(tempValue+"\t");
//                        count++;
//                    }
//
//                }
//                System.out.println(fieldName);
//                System.out.println(fieldValue);
//            }
//            System.out.println("total property "+count+"");
//            System.out.println("-------------------finshed------------------------");
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * Function: 格式化字符串，如果字符串不足len位，则在字符串前补足空格
//     * @param str
//     * @param len
//     * @return
//     * Create author:luojunlin
//     * Create on:${date}
//     * Edit author:
//     * Edit on:
//     * Why:
//     */
//    static String formatString(String str,int len) {
//        StringBuilder temp=new StringBuilder();
//        if (str.length()<len) {
//            for (int i=0; i<(len-str.length()); i++){
//                temp.append(" ");
//            }
//        }
//        temp.append(str);
//        return temp.toString();
//    }
//
//
//    /**
//     * 循环向上转型,获取对象的DeclaredField.
//     * @author 钟永生
//     * @throws NoSuchFieldException 如果没有该Field时抛出.
//     */
//    public static Field getDeclaredField(Object object, String propertyName) throws NoSuchFieldException {
//        Assert.notNull(object);
//        Assert.hasText(propertyName);
//        return getDeclaredField(object.getClass(), propertyName);
//    }
//
//    /**
//     * 循环向上转型,获取对象的DeclaredField.
//     * @author 钟永生
//     * @throws NoSuchFieldException 如果没有该Field时抛出.
//     */
//    public static Field getDeclaredField(Class<?> clazz, String propertyName) throws NoSuchFieldException {
//        Assert.notNull(clazz);
//        Assert.hasText(propertyName);
//        for (Class<?> superClass = clazz; superClass != Object.class; superClass = superClass.getSuperclass()) {
//            try {
//                return superClass.getDeclaredField(propertyName);
//            } catch (NoSuchFieldException e) {
//                // Field不在当前类定义,继续向上转型
//            }
//        }
//        throw new NoSuchFieldException("No such field: " + clazz.getName() + '.' + propertyName);
//    }
//
//    /**
//     * 方法用途和描述:暴力获取当前类声明的private/protected变量
//     * 方法的实现逻辑描述：
//     * @param object
//     * @param propertyName
//     * @return
//     * @throws IllegalAccessException
//     * @throws NoSuchFieldException
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期：2008-3-27
//     */
//    static public Object getDeclaredProperty(Object object, String propertyName)
//            throws IllegalAccessException, NoSuchFieldException {
//        Assert.notNull(object);
//        Assert.hasText(propertyName);
//        Field field = object.getClass().getDeclaredField(propertyName);
//        return getDeclaredProperty(object, field);
//    }
//
//    /**
//     * 方法用途和描述:暴力获取当前类声明的private/protected变量
//     * 方法的实现逻辑描述：
//     * @param object
//     * @param field
//     * @return
//     * @throws IllegalAccessException
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期：2008-3-27
//     */
//    static public Object getDeclaredProperty(Object object, Field field)
//            throws IllegalAccessException {
//        Assert.notNull(object);
//        Assert.notNull(field);
//        boolean accessible = field.isAccessible();
//        field.setAccessible(true);
//        Object result = field.get(object);
//        field.setAccessible(accessible);
//        return result;
//    }
//
//    /**
//     * 方法用途和描述:暴力设置当前类声明的private/protected变量
//     * 方法的实现逻辑描述：
//     * @param object
//     * @param propertyName
//     * @param newValue
//     * @throws IllegalAccessException
//     * @throws NoSuchFieldException
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期：2008-3-27
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期：2008-3-27
//     */
//    static public void setDeclaredProperty(Object object, String propertyName,
//                                           Object newValue) throws IllegalAccessException,
//            NoSuchFieldException {
//        Assert.notNull(object);
//        Assert.hasText(propertyName);
//        Field field = object.getClass().getDeclaredField(propertyName);
//        setDeclaredProperty(object, field, newValue);
//    }
//
//    /**
//     * 方法用途和描述:暴力设置当前类声明的private/protected变量
//     * 方法的实现逻辑描述：
//     * @param object
//     * @param field
//     * @param newValue
//     * @throws IllegalAccessException
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期：2008-3-27
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期：2008-3-27
//     */
//    static public void setDeclaredProperty(Object object, Field field,
//                                           Object newValue) throws IllegalAccessException {
//        boolean accessible = field.isAccessible();
//        field.setAccessible(true);
//        field.set(object, newValue);
//        field.setAccessible(accessible);
//    }
//
//    /**
//     * 方法用途和描述:暴力调用当前类声明的private/protected函数
//     * 方法的实现逻辑描述：
//     * @param object
//     * @param methodName
//     * @param params
//     * @return
//     * @throws NoSuchMethodException
//     * @throws IllegalAccessException
//     * @throws InvocationTargetException
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期：2008-3-27
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期：2008-3-27
//     */
//    static public Object invokePrivateMethod(Object object, String methodName,
//                                             Object... params) throws NoSuchMethodException,
//            IllegalAccessException, InvocationTargetException {
//        Assert.notNull(object);
//        Assert.hasText(methodName);
//        Class<?>[] types = new Class[params.length];
//        for (int i = 0; i < params.length; i++) {
//            types[i] = params[i].getClass();
//        }
//        Method method = object.getClass().getDeclaredMethod(methodName, types);
//        boolean accessible = method.isAccessible();
//        method.setAccessible(true);
//        Object result = method.invoke(object, params);
//        method.setAccessible(accessible);
//        return result;
//    }
//
//    /**
//     * 方法用途和描述:按Filed的类型取得Field列表
//     * 方法的实现逻辑描述：
//     * @param object
//     * @param type
//     * @return
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期：2008-3-27
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期：2008-3-27
//     */
//    static public List<Field> getFieldsByType(Object object, Class<?> type) {
//        ArrayList<Field> list = new ArrayList<Field>();
//        Field[] fields = object.getClass().getDeclaredFields();
//        for (Field field : fields) {
//            if (field.getType().isAssignableFrom(type)) {
//                list.add(field);
//            }
//        }
//        return list;
//    }
//
//    /**
//     * 方法用途和描述:获得field的getter名称
//     * 方法的实现逻辑描述：
//     * @param type
//     * @param fieldName
//     * @return
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期：2008-3-27
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期：2008-3-27
//     */
//    public static String getAccessorName(Class<?> type, String fieldName) {
//        Assert.hasText(fieldName, "FieldName required");
//        Assert.notNull(type, "Type required");
//        if (type.getName().equals("boolean")) {
//            return "is" + StringUtils.capitalize(fieldName);
//        } else {
//            return "get" + StringUtils.capitalize(fieldName);
//        }
//    }
//
//    /**
//     * 方法用途和描述:获得field的getter名称
//     * 方法的实现逻辑描述：
//     * @param type
//     * @param fieldName
//     * @return
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 新增日期：2008-3-27
//     * @author <a href="mailto:iffiff1@hotmail.com">Tyler Chen</a> 修改日期：2008-3-27
//     */
//    public static Method getAccessor(Class<?> type, String fieldName) {
//        try {
//            return type.getMethod(getAccessorName(type, fieldName));
//        } catch (NoSuchMethodException e) {
//        }
//        return null;
//    }
//}
